#include <iostream>
#include <list>
using namespace std;

/*
    list本质是链表
*/

class Test
{
public:
    bool operator()(int a, int b)
    {
        return a > b;
    }
};

int main()
{
    list<int> l1, l2;
    for (int i = 0; i < 10; i++)
    {
        l1.push_back(10 + i);
    }
    for (int i = 0; i < 5; i++)
    {
        l2.push_back(5 + i);
        l2.push_back(5 + i);
    }

    cout << "===================megre========================" << endl;
    // 合并两个链表,被合并的链表(l2)会被清空；如果合并的两个链表都是升序的，合并之后的链表会按顺序排序
    l1.merge(l2);
    for (int x : l1)
        cout << x << " ";
    cout << endl;
    cout << "===================remove=======================" << endl;
    // 删除链表中的指定元素 ， 如果没有找到指定元素，则不会删除
    // 如果找到的指定元素有多个，则全部删除
    l1.remove(15);
    l1.remove(5);
    for (int x : l1)
        cout << x << " ";
    cout << endl;
    cout << "===================sort=======================" << endl;
    // l1.sort(); // 升序排序
    // l1.sort([](int a, int b){ return a > b; }); // 降序排序
    Test t1;
    l1.sort(t1);
    for (int x : l1)
        cout << x << " ";
    cout << endl;
    cout << "===================splice=======================" << endl;
    // 将另一个list中的元素插入到当前list的指定位置的前面 ，被插入的list会被清空
    list<int> l3= {1,2,5,4,7};
    // l1.splice(l1.begin(), l3);
    // l1.splice(l1.begin(), l3, l3.begin());  //将l3的指定位置插入到l1的begin()位置
    l1.splice(l1.begin(), l3, l3.begin(), l3.end());//将l3begin到end范围的元素插入到l1的begin()位置
    for (int x : l1)
        cout << x << " ";
    cout << endl;

    return 0;
}